package com.xscha.tableforge.service;

import com.xscha.tableforge.model.dto.TableMetaDto;
import com.xscha.tableforge.model.vo.PageReq;
import com.xscha.tableforge.model.vo.PageResult;

import java.util.List;
import java.util.Map;

/**
 * 动态表服务接口
 * 提供动态表的创建、查询、更新和删除等操作
 */
public interface TableDataService {

    /**
     * 创建新的数据表
     *
     * @param tableMetaDTO 表元数据DTO，包含表的基本信息和字段定义
     * @param userId 创建者用户ID
     * @return 创建成功后的表元数据DTO，包含生成的ID和其他信息
     */
    TableMetaDto createTable(TableMetaDto tableMetaDTO, String userId);

    /**
     * 获取表元数据及其字段
     *
     * @param tableId 表ID
     * @return 表元数据DTO，包含表的基本信息和字段定义
     * @throws RuntimeException 如果表不存在
     */
    TableMetaDto getTableMetaWithFields(String tableId);

    /**
     * 动态查询数据
     *
     * @param tableId 表ID
     * @param conditions 查询条件，键值对形式
     * @return 符合条件的数据列表
     * @throws RuntimeException 如果表不存在
     */
    List<Map<String, Object>> queryData(String tableId, Map<String, Object> conditions);

    /**
     * 分页查询数据
     *
     * @param tableId 表ID
     * @param conditions 查询条件，键值对形式
     * @param pageRequest 分页请求参数，包含页码、每页大小和排序信息
     * @return 分页结果，包含数据列表和分页信息
     * @throws RuntimeException 如果表不存在
     */
    PageResult<Map<String, Object>> queryDataPage(String tableId, Map<String, Object> conditions, PageReq pageRequest);

    /**
     * 动态插入数据
     *
     * @param tableId 表ID
     * @param data 要插入的数据，键值对形式
     * @param userId 创建者用户ID
     * @return 插入成功后的数据，包含生成的ID和其他信息
     * @throws RuntimeException 如果表不存在
     */
    Map<String, Object> insertData(String tableId, Map<String, Object> data, String userId);

    /**
     * 动态更新数据
     *
     * @param tableId 表ID
     * @param recordId 记录ID
     * @param data 要更新的数据，键值对形式
     * @param userId 更新者用户ID
     * @return 更新后的数据
     * @throws RuntimeException 如果表不存在
     */
    Map<String, Object> updateData(String tableId, String recordId, Map<String, Object> data, String userId);

    /**
     * 软删除数据
     *
     * @param tableId 表ID
     * @param recordId 记录ID
     * @param userId 删除者用户ID
     * @throws RuntimeException 如果表不存在
     */
    void softDeleteData(String tableId, String recordId, String userId);

	/**
	 * 保存记录（包括关联字段数据）
	 *
	 * @param tableId 表ID
	 * @param recordData 记录数据
	 * @param userId 用户ID
	 * @return 保存后的记录
	 */
	Map<String, Object> saveRecord(String tableId, Map<String, Object> recordData, String userId);

    /**
     * 查询记录及其关联数据
     *
     * @param tableId 表ID
     * @param recordId 记录ID
     * @param includeRelations 需要包含的关联字段列表，为null时包含所有关联字段
     * @return 包含关联数据的记录
     */
    Map<String, Object> queryRecordWithRelations(String tableId, String recordId, List<String> includeRelations);

    /**
     * 查询特定关联字段的关联数据
     *
     * @param tableId 表ID
     * @param recordId 记录ID
     * @param fieldName 关联字段名
     * @return 关联数据
     */
    Object queryRelationData(String tableId, String recordId, String fieldName);
}